package com.vy.stl.controller;

import com.vy.stl.constants.Constants;
import com.vy.stl.entity.Admin;
import com.vy.stl.service.AdminService;
import com.vy.stl.util.JWTUtil;
import com.vy.stl.util.Result;
import com.vy.stl.vo.AdminVO;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @create: 2025/08/21 15:59
 * @description:
 */
//@Controller
@RestController
// 1.相当于@Controller+@ResponseBody
// 2.自动将控制器方法的返回值序列化为JSON/XML格式
// 3.更适合前后端分离架构，直接向前端返回数据而非视图
// 4.前端通过AJAX请求后可以直接解析返回的JSON数据
@RequestMapping("/admin")
@Slf4j
public class AdminController {

    @Autowired
    private AdminService adminService;

    //处理查询管理员信息的请求
//    @RequestMapping("/?")//不规范的URL路径写法，会导致请求路径匹配异常
    @GetMapping//@RequestMapping(method = RequestMethod.GET)的简化//该方法处理HTTP GET请求//映射的请求路径为GET /admin
    public Result getAll(Integer page, Integer limit, Admin admin) {
        //检查page和limit是否都为空
        if (ObjectUtils.isEmpty(page) && ObjectUtils.isEmpty(limit)) {
            //都为空，则不需要分页，查询所有符合条件的管理员
            List<Admin> adminList = adminService.search(admin);
            return Result.success(Constants.STATUS_200, adminList);
        }
        //不为空，则需要分页，进行分页查询
        return Result.success(Constants.STATUS_200, adminService.searchByPage(page,limit,admin));
    }

    @PostMapping //该方法只处理HTTP POST请求
    public Result add(@RequestBody Admin admin) {//@RequestBody：将请求体中的JSON/XML数据反序列化成Admin对象
        try{
            int row = adminService.addAdmin(admin);//row：受影响行数
            if (row == 0) {
                return Result.error(Constants.STATUS_10001,"添加管理员失败");
            } else if (row == Constants.PHONE_HAS_ERROR) {
                return Result.error(Constants.PHONE_HAS_ERROR,"手机号被占用");
            }
        } catch (Exception e) {
            // 添加失败，打印日志
            log.info("log日志：添加失败");
            return Result.error(Constants.STATUS_10001,"添加管理员失败");
        }
        return Result.success(Constants.STATUS_200);
    }

    //*****管理员只能改自己的密码。
    //处理前端发送的「修改管理员信息」的HTTP请求
//    @PutMapping//将HTTP的PUT方法请求映射到当前方法，PUT通常用于更新已有资源
//    public Result modifyAdmin(@RequestBody Admin admin) {//@RequestBody：将HTTP请求体中的数据（通常是JSON格式）自动转换为Java对象（Admin实体类对象
//        try {
//            adminService.modifyAdmin(admin);
//            return Result.success(Constants.STATUS_200);
//        } catch (Exception e) {
//            log.info(e.getMessage());
//            return Result.error(-1,e.getMessage());
//        }
//    }

    @PutMapping//将HTTP的PUT方法请求映射到当前方法，PUT通常用于更新已有资源
    public Result modifyAdmin(@RequestBody Admin admin, HttpServletRequest request) {//@RequestBody：将HTTP请求体中的数据（通常是JSON格式）自动转换为Java对象（Admin实体类对象
        try {
            // 1. 先执行修改操作（包含密码加密等业务逻辑）
            adminService.modifyAdmin(admin);
            // 2. 获取当前登录用户的token并解析
            String token = request.getHeader("token");
            if (StringUtils.hasText(token)) {
                // 解析Token
                Claims claims = JWTUtil.parseJWT(token);
                String subject = claims.getSubject();
                Admin logingAdmin = adminService.getAdminByPhone(subject);
                // 3. 判断：是否修改了【当前登录管理员】的【密码】
                // 注意：用equals比较对象id（避免long类型的==问题）
                if (logingAdmin != null && admin.getId().equals(logingAdmin.getId())
                        && StringUtils.hasText(admin.getPassword())) {
                    // 条件：是当前登录用户，且修改了密码 → 需要重新登录
                    return Result.error(Constants.NEED_RELOGIN_STATUS, "密码已修改，请重新登录");
                }
                //return Result.error(-1,"没有登录");
            }
            return Result.success(Constants.STATUS_200);
        } catch (Exception e) {
            log.info(e.getMessage());
            return Result.error(-1,e.getMessage());
        }
    }

    @RequestMapping("/getAdmin")
    public void getAdmin(String phone) {
        System.out.println("传入的参数是："+phone);
        Admin admin = adminService.getAdminByPhone(phone);
        System.out.println(admin);
    }

    @PostMapping("/login")
    public Result login(@RequestBody AdminVO adminVO) {
        // 开始尝试登录
        try {
            if (!StringUtils.hasText(adminVO.getKey())) {
                throw new Exception("无效的验证码");
            }
            // 解析JWT判断用户输入的验证码是否正确
            Claims claims = JWTUtil.parseJWT(adminVO.getKey());
            // 获取保存的验证码
            String oldCaptcha = claims.getSubject();
            if (!StringUtils.hasText(oldCaptcha)) {
//                throw new Exception("验证码已经过期");
                return Result.error(Constants.CAPTCHA_OBS,"验证码已过时");
            }
            if (!oldCaptcha.equalsIgnoreCase(adminVO.getCaptcha())) {
                // 验证码错误
//                throw new Exception("验证码错误");
                return Result.error(Constants.CAPTCHA_ERROR,"验证码错误");
            }
            // 校验登录
            Admin admin = adminService.login(adminVO);
            String token = JWTUtil.createJWT(admin.getPhone());
            return Result.success(Constants.STATUS_200,token);
        } catch (Exception e) {
            log.info("登录失败");
            return Result.error(Constants.ADMIN_LOGIN_ERROR,e.getMessage());
        }
    }

    @RequestMapping("/getLogin")
    public Result getLogin(HttpServletRequest request) {
        // 获取后台用户的登录信息(Admin对象)
        // 前端的每一个请求都会有一个拦截，将token存放到请求头中
        System.out.println("request = " + request);
        // 将获取的登录用户的对象返回
        String token = request.getHeader("token");
        System.out.println("token = " + token);
        if (StringUtils.hasText(token)) {
            try {
                // 解析Token
                Claims claims = JWTUtil.parseJWT(token);
                String subject = claims.getSubject();
                Admin admin = adminService.getAdminByPhone(subject);
                return Result.success(Constants.STATUS_200,admin);
            } catch (Exception e) {
                return Result.error(-1,"没有登录");
            }
        }
        return Result.error(-1,"没有登录");
    }
}






